package cn.xuqiudong.backend.base.auth;

import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
import cn.xuqiudong.backend.base.auth.user.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 描述:
 *  sa token  鉴权相关工具类
 * @author Vic.xu
 * @since 2025-02-05 17:11
 */
@Service
public class SaTokenAuthHelper {


    @Autowired(required = false)
    private UserInfoService userInfoService;
    /**
     * 用户登录   返回 Token
     * @param userId 用户 ID
     * @param rememberMe 是否记住我
     */
    public String login(Integer userId, boolean rememberMe) {
        //  true 记住我模式 sa-token.timeout-remember-me;  false:仅使用默认 8 小时模式  受 sa-token.timeout 配置控制
        StpUtil.login(userId, rememberMe);
        return StpUtil.getTokenValue();
    }

    /**
     * 退出登录
     */
    public static void logout() {
        StpUtil.logout();
    }

    public static void setUserInfo(Object  userInfo) {
        SaSession session = StpUtil.getSession();
        session.set("userInfo", userInfo);
    }
    public static Object getUserInfo() {
        SaSession session = StpUtil.getSession();
        return session.get("userInfo");
    }


    /**
     * 判断用户是否已登录，并自动恢复登录
     */
    public void checkAndAutoLogin() {
        // 如果 Token 已失效
        if (!StpUtil.isLogin()) {
            String tokenValue = StpUtil.getTokenValue();
            if (tokenValue != null) {
                try {
                    // 通过 Token 获取 loginId（即使 Session 过期也能获取）
                    Object loginId = StpUtil.getLoginIdByToken(tokenValue);
                    if (loginId != null) {
                        // 重新登录，并恢复 Session
                        StpUtil.login(loginId);
                    }
                } catch (Exception e) {
                    // Token 可能已经完全失效，忽略异常
                }
            }
        }
    }
}
